/**
 * 本例说明了几个重要的概念：
 * 1.完全限定名
 * 2.如何调用重名的方法-因为类型本身和特质存在重名
 */
trait Fight{
    fn fight(&self);
    fn rest();
}

struct Student{
    name:String
}
impl  Student{
    /**
     * fight是关联函数，因为它带有self参数，所以不能直接调用特质中的同名方法，
     * 必须通过实例调用
     */
    fn fight(&self){
        println!("{} 在独斗.十步杀一人，千里不留行", self.name);
    }
    /**
     * rest是静态方法，不是关联方法，可以直接通过类型调用
     * 所以不能通过实例调用，只能通过类型调用
     */
    fn  rest(){
        println!("休息一下");
    }
}
impl Fight for Student{
    fn fight(&self){
        println!("{} 在团战.", self.name);
    }
    fn rest(){
        println!("大家休息一下");
    }
}

fn main() {
    let stu = Student{name:"小明".to_string()};
    // 三种调用方式,调取不同的方法
    // 1.实例后跟上方法
    // 2.特质名::方法(&实例)
    // 3.<Type as Trait>::function(receiver_if_method, next_arg, ...);

    stu.fight();//1.实例跟上方法
    Fight::fight(&stu);   //2.特质名::方法(&实例) -- 实际是调用特质的方法
    <Student as Fight>::fight(&stu);  //3.特质名::方法(&实例) -- 实际是调用对象实例的方法

    Student::rest();  //4.类型的静态方法
    <Student as Fight>::rest();
}
